//
//  StatusListViewModel.swift
//  WeiBo09
//
//  Created by 裘明 on 15/9/10.
//  Copyright © 2015年 qm. All rights reserved.
//

import UIKit
import ReactiveCocoa
import SDWebImage

/// 微博列表视图模型
class StatusListViewModel: NSObject {
    
//    var rowHeight: CGFloat = 0
    /// 微博模型数组
    lazy var statuses = [StatusViewModel]()
    
    func loadStatus(isPullupRefresh isPullupRefresh: Bool) -> RACSignal {
        
        // 初始刷新: statuses 数组没有内容
        // 下拉刷新: 取 statuses 的第一项的 id 作为 since_id
        var since_id = (statuses.count ?? 0) == 0 ? 0 : (statuses.first)!.status.id
        var max_id = 0
        // 上拉刷新: 取 statuses 的最后一项的 id 作为 max_id
        if  isPullupRefresh {
            since_id = 0
            
            max_id = statuses.last?.status.id ?? 0
        }
       return RACSignal.createSignal ({ [weak self] (subscriber) -> RACDisposable! in
            
        // 网络工具，执行的时候，会对 self 进行强引用，网络访问结束后，后对 self 的引用释放！
        NetWorkTools.shareNetwork.loadStatus(since_id: since_id, max_id: max_id).subscribeNext({ (result) -> Void in
            
             // 1. 获取 result 中的 statuses 字典数组
                    guard let array = result["statuses"] as? [[String: AnyObject]] else {
                        printLog("没有正确的数据")
                        subscriber.sendError(NSError(domain: "com.itheima.error", code: -1002, userInfo: ["error message": "没有正确数据"]))
                        return
                    }                    // 定义一个临时数组，用来记录网络请求返回的数据
                    var arrayM = [StatusViewModel]()
                    // 2.字典转模型
                    // 遍历数组
                    for dict in array {
                        arrayM.append(StatusViewModel(status: Status(dict: dict)))
                    }
                    // 添加尾随闭包
                    self?.cacheWebImage(arrayM) {

                        if max_id > 0 {
                            
                            self?.statuses += arrayM // 将新数据添加到现有的数据未尾
                        } else {
                            self?.statuses = arrayM + self!.statuses
                        }
                        if since_id > 0 {
                            subscriber.sendNext(arrayM.count)
                        }
                        
                         subscriber.sendCompleted()
                    }
                
                }, error: { (error) -> Void in
                    
                    subscriber.sendError(error)
                    
                })  {}
            
            
            return nil
        })
        
    }
    /// 缓存网络图片
    private func cacheWebImage(array: [StatusViewModel], finished: () -> ()) {
        
        // 创建调度组
        let group = dispatch_group_create()
        
        // 记录下载图片大小
        var dataLength = 0
        
        for viewModel in array {
            
            // 只缓存单张图片
            let count = viewModel.thumbnailUrl?.count ?? 0
            
            if count != 1 {
                continue
            }
            
            print(viewModel.thumbnailUrl)
            // 入组
            dispatch_group_enter(group)
//            print("------缓存图片完成---")

            
            SDWebImageManager.sharedManager().downloadImageWithURL(viewModel.thumbnailUrl![0], options: [], progress: nil, completed: { (image, _, _, _, _) -> Void in
                
                // 1.如果有下载图片
                if image != nil {
                    let data = UIImagePNGRepresentation(image)
                    
                    dataLength += data?.length ?? 0
                }
//                print("------缓存图片完成---")

                // 出组
                dispatch_group_leave(group)
            })
            
        }
        
        dispatch_group_notify(group, dispatch_get_main_queue(), { () -> Void in
            
//            print("###缓存图片完成###")
            finished()
        })
        
    }
  }
